home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / bin2snd / bin2snd.c next >
C/C++ Source or Header  |  1994-11-13  |  4KB  |  149 lines

  1. /* バイナリファイルをSNDファイルに変換するツール by Ushio */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. typedef struct
  7. {
  8.     char           name[8];
  9.     unsigned long  id;
  10.     unsigned long  length;
  11.     unsigned long  looppoint;
  12.     unsigned long  looplength;
  13.     unsigned short freq;
  14.     unsigned short adjust;
  15.     unsigned char  note;
  16.     unsigned char  reserve1;
  17.     unsigned short reserve2;
  18. } SNDBUF;
  19.  
  20. unsigned int Freq = 20*0x62;
  21. char Filename_bin[256]="";
  22. char Filename_snd[256]="";
  23.  
  24. int fexist( char *fn )
  25. {
  26.     FILE *fp;
  27.     if ( (fp = fopen( fn,"r" )) == NULL )
  28.         return 0;
  29.     fclose(fp);
  30.     return 1;
  31. }
  32. long fsize( char *fn )
  33. {
  34.     FILE *fp = fopen( fn,"rb" );
  35.     long size, save = ftell( fp );
  36.     if ( fseek( fp, 0, SEEK_END ) != 0 )    { fclose(fp); return -1; }
  37.     if ( (size = ftell( fp )) < 0 )            { fclose(fp); return -1; }
  38.     if ( fseek( fp, save, SEEK_SET ) != 0 )    { fclose(fp); return -1; }
  39.     fclose(fp);
  40.     return size;
  41. }
  42. int arg( int argc, char *argv[] )
  43. {
  44.     int i;
  45.     char sw, *para;
  46.     char *p;
  47.     
  48.     if ( argc < 2 )
  49.         return 1;
  50.     for ( i=1; i<argc; i++ ) {
  51.         if ( argv[i][0]!='-' && argv[i][0]!='/' ) {
  52.             if ( Filename_bin[0] == '\0' )
  53.                 strcpy(Filename_bin,argv[i]);
  54.             else if ( Filename_snd[0] == '\0' )
  55.                 strcpy(Filename_snd,argv[i]);
  56.             else
  57.                 return 4;
  58.         } else {
  59.             sw = argv[i][1];
  60.             if ( sw!='\0' && argv[i][2]!='\0' ) {
  61.                 para = argv[i] + 2;
  62.             } else {
  63.                 if ( i<argc )
  64.                     para = argv[++i];
  65.                 else
  66.                     para = "";
  67.             }
  68. printf("i=%d,sw=%d(%c),para='%s'\n",i,sw,sw,para);
  69.             switch ( sw ) {
  70.                 case 'h': case 'H':    case '?':
  71.                     return 'h';
  72.                 case 'f': case 'F':
  73.                     Freq = atof( para ) * 0x62;
  74.                     if ( Freq<0 || 20*0x62<Freq ) {
  75.                         fprintf(stderr,"    周波数が不正です(%u).\n",Freq/0x62);
  76.                         return 'f';
  77.                     }
  78.                     break;
  79.                 default:
  80.                     fputs("    不正なパラメーターです.\n",stderr);
  81.                     return 2;
  82.             }
  83.         }
  84.     }
  85.     if (Filename_bin[0]=='\0') {
  86.         fputs("   ファイルを指定してください.\n",stderr);
  87.         return 3;
  88.     }
  89.     if (Filename_snd[0]=='\0') {
  90.         strcpy( Filename_snd, Filename_bin );
  91.         p = strrchr( Filename_snd, '.' ) ;
  92.         if ( p==NULL || p[1]=='\\' )
  93.             p = Filename_snd + strlen(Filename_snd) ;
  94.         strcpy( p, ".snd" );
  95.     }
  96.     if ( stricmp( Filename_bin, Filename_snd ) == 0 ) {
  97.         fputs("   同名のファイルです.\n",stderr);
  98.         return 5;
  99.     }
  100.     return 0;
  101. }
  102.  
  103. int main( int argc, char *argv[] )
  104. {
  105.     FILE *fp;
  106.     SNDBUF buf;
  107.     char comstr[256];
  108.     
  109.     if ( arg(argc,argv)!=0 ) {
  110.         fputs("\nバイナリファイルをSNDファイルに変換するツール by Ushio.",stderr);
  111.         fputs("\n Use : bin2snd [-f freq(kHz)] BINfile [SNDfile]\n",stderr);
  112.         return 1;
  113.     }
  114. printf("Filename_bin='%s',Filename_snd='%s'\n",Filename_bin,Filename_snd);
  115.     if ( ! fexist(Filename_bin) ) {
  116.         printf("\n   \"%s\" がオープン出来ません.",Filename_bin);
  117.         return 1;
  118.     }
  119.     if ( (fp=fopen(Filename_snd,"wb"))==NULL ) {
  120.         printf("\n   \"%s\" がオープン出来ません.",Filename_snd);
  121.         return 1;
  122.     }
  123.     buf.name[0] ='\0';
  124.     buf.id = 0;
  125.     buf.length = fsize(Filename_bin);
  126.     buf.looppoint = 0;
  127.     buf.looplength = 0;
  128.     buf.freq = Freq;
  129.     buf.adjust = 0;
  130.     buf.note = 60;
  131.     
  132.     if ( fwrite(&buf, sizeof(buf), 1, fp)<1 ) {
  133.         fprintf(stderr,"\n   \"%s\" を書き込めません(data).",Filename_snd);
  134.         fclose(fp);
  135.         return 1;
  136.     }
  137.     fclose(fp);
  138.     
  139.     printf("freqency %lu\n",buf.freq*0x64);
  140.     printf("length %#010x %16lu\n",buf.length,buf.length);
  141.     
  142.     sprintf(comstr,"copy /b %s+%s %s > nul",Filename_snd,Filename_bin,Filename_snd);
  143.     puts( comstr );
  144.     system( comstr );
  145.     
  146.     return 0 ;
  147.  
  148. }
  149.